package com.cruise.game.service.impl.common;

import com.cruise.game.common.api.ApiException;
import com.cruise.game.common.utils.OssUtils;
import com.cruise.game.service.common.UploadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.Arrays;

/**
 * 文件上传服务实现
 * 
 * @author cruise
 * @date 2025-02-28
 */
@Slf4j
@Service
public class UploadServiceImpl implements UploadService {

    @Resource
    private OssUtils ossUtils;

    /**
     * 允许的图片类型
     */
    private static final String[] ALLOWED_IMAGE_TYPES = {
            "image/jpeg", "image/png", "image/gif", "image/bmp", "image/webp"
    };

    /**
     * 最大图片大小（10MB）
     */
    private static final long MAX_IMAGE_SIZE = 10 * 1024 * 1024;

    /**
     * 最大文件大小（20MB）
     */
    private static final long MAX_FILE_SIZE = 20 * 1024 * 1024;

    @Override
    public String uploadImage(MultipartFile file) {
        // 校验图片类型
        String contentType = file.getContentType();
        if (contentType == null || !Arrays.asList(ALLOWED_IMAGE_TYPES).contains(contentType)) {
            throw new ApiException("不支持的图片类型");
        }

        // 校验图片大小
        if (file.getSize() > MAX_IMAGE_SIZE) {
            throw new ApiException("图片大小不能超过10MB");
        }

        // 上传图片
        return ossUtils.uploadFileToDir(file, "images");
    }

    @Override
    public String uploadAvatar(MultipartFile file) {
        // 校验图片类型
        String contentType = file.getContentType();
        if (contentType == null || !Arrays.asList(ALLOWED_IMAGE_TYPES).contains(contentType)) {
            throw new ApiException("不支持的头像图片类型");
        }

        // 校验图片大小
        if (file.getSize() > MAX_IMAGE_SIZE) {
            throw new ApiException("头像大小不能超过10MB");
        }

        // 使用专门的头像上传方法
        return ossUtils.uploadAvatar(file);
    }

    @Override
    public String uploadProductImage(MultipartFile file) {
        // 校验图片类型
        String contentType = file.getContentType();
        if (contentType == null || !Arrays.asList(ALLOWED_IMAGE_TYPES).contains(contentType)) {
            throw new ApiException("不支持的商品图片类型");
        }

        // 校验图片大小
        if (file.getSize() > MAX_IMAGE_SIZE) {
            throw new ApiException("商品图片大小不能超过10MB");
        }

        // 使用专门的商品图片上传方法
        return ossUtils.uploadProductImage(file);
    }

    @Override
    public String uploadOrderCompleteImage(MultipartFile file) {
        // 校验图片类型
        String contentType = file.getContentType();
        if (contentType == null || !Arrays.asList(ALLOWED_IMAGE_TYPES).contains(contentType)) {
            throw new ApiException("不支持的完单图片类型");
        }

        // 校验图片大小
        if (file.getSize() > MAX_IMAGE_SIZE) {
            throw new ApiException("完单图片大小不能超过10MB");
        }

        // 使用专门的完单图片上传方法
        return ossUtils.uploadOrderCompleteImage(file);
    }

    @Override
    public String uploadFile(MultipartFile file, String dir) {
        // 校验文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new ApiException("文件大小不能超过20MB");
        }

        // 上传文件
        return ossUtils.uploadFileToDir(file, dir);
    }

    @Override
    public boolean deleteFile(String fileUrl) {
        try {
            ossUtils.deleteFile(fileUrl);
            return true;
        } catch (Exception e) {
            log.error("删除文件失败: {}", e.getMessage(), e);
            return false;
        }
    }
}
